package lsl.leetCode.test0723;

/**
 * 力扣 21
 *
 * @author Zed
 * @description 合并两个有序链表
 * @date 2022/7/23 12:34
 */
public class    test21 {
    public static void main(String[] args) {
        int[] nums1 = {1, 3, 6, 26, 17, 39};
        int[] nums2 = {4, 9, 11, 16, 19, 35};
        ListNode listNode1 = arrayToListNode(nums1);
        ListNode listNode2 = arrayToListNode(nums2);
        display(mergeTwoLists(listNode1, listNode2));
    }

    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        }
        if (l2 == null) {
            return l1;
        }

        if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }
    }

    /**
     * 数组转链表
     *
     * @param arrays
     * @return
     */
    public static ListNode arrayToListNode(int[] arrays) {
        if (arrays.length == 0) {
            return null;
        }
        // 用数组的第一个元素生成一个新的链表
        ListNode head = new ListNode(arrays[0]);
        // 声明前一个节点等于头节点
        ListNode pre = head;
        for (int i = 1; i < arrays.length; i++) {
            // 要插入的节点对象
            ListNode node = new ListNode(arrays[i]);
            // 前一个节点的 next 指向当前节点
            pre.next = node;
            // 更新前一个节点
            pre = node;
        }
        return head;
    }

    /**
     * 打印链表
     *
     * @param listNode
     */
    public static void display(ListNode listNode) {
        if (listNode == null) {
            return;
        } else {
            while (listNode.next != null) {
                System.out.print(listNode.val + " -> ");
                listNode = listNode.next;
            }
        }
        System.out.println(listNode.val);
    }

    static class ListNode {
        int val;
        ListNode next;

        //这个方式赋值
        ListNode(int x) {
            val = x;
        }
    }
}
